﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.IO;
using System.Drawing.Imaging;
using Microsoft.Win32.SafeHandles;
using CRC.Incidencias.Dominio.Clases;

namespace CRC.GestionSalones.Dominio.Clases
{
    public class Foto
    {
        public Foto() { }
        
        /// <summary>
        /// Constructora que toma la ruta de la imagen
        /// su categoria y un comentario de la misma.
        /// </summary>
        /// <param name="strArchivo">Ruta de la imagen</param>
        /// <param name="pCategoria">Categoria por la que se ha clasificado</param>
        /// <param name="pStrComentarios">Comentario sober la foto</param>
        public Foto(String strArchivo, Categoria pCategoria, String pStrComentarios) : this()
        {
            try
            {
                this.cat = pCategoria;
                this.strNombre = ExtraerNombreImagen(strArchivo);
                this.strComentario = pStrComentarios;

                fsImagen = new FileStream(strArchivo, FileMode.Open, FileAccess.Read);
                //Imagen
                this.imagen = new Byte[fsImagen.Length];
                fsImagen.Read(this.imagen, 0, imagen.Length);
                //Thumbnail
                Image imgOriginal = Image.FromStream(fsImagen); 
                Image imgThumb = imgOriginal.GetThumbnailImage(139, 105, null, IntPtr.Zero);
                
                imgThumb.Save("crc_thumb.tmp");
                fsMiniatura = new FileStream("crc_thumb.tmp", FileMode.Open, FileAccess.Read);
                this.miniatura = new Byte[fsMiniatura.Length];
                fsMiniatura.Read(this.miniatura, 0, this.miniatura.Length);

            }
            catch (IOException ioEx) 
            {
                throw ioEx;
            }
            finally {
                if (fsImagen != null) fsImagen.Close();
                if (fsMiniatura != null) fsMiniatura.Close();
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="strArchivo"></param>
        /// <param name="pCategoria"></param>
        /// <param name="pStrComentarios"></param>
        /// <param name="pSal"></param>
        public Foto(String strArchivo, Categoria pCategoria, String pStrComentarios, Salon pSal):
            this(strArchivo, pCategoria, pStrComentarios) 
        {
            pSal.añadirFoto(this);
        }

        private int intId;
        private String strNombre;
        private Categoria cat = null;
        private Byte[] imagen = null;
        private Byte[] miniatura = null;
        private String strComentario;
        private Salon salon = null;

        // Stram's para pasar Byte[] -> Imagen
        private FileStream fsImagen = null;
        private FileStream fsMiniatura = null;
        private MemoryStream msImagen = null;
        private MemoryStream msMiniatura = null;

        public virtual int Id 
        { 
            get { return this.intId; }
            set { this.intId = value; }
        }

        public virtual String Nombre 
        {
            get { return this.strNombre; }
            set { this.strNombre = value; }
        }

        public virtual Image Imagen()
        {
                try 
                {
                    msImagen = new MemoryStream(imagen);
                    Image tmp = Image.FromStream(msImagen);
                    return tmp;
                }
                catch(IOException ioEx) 
                {
                    if (msImagen != null) msImagen.Close();
                    throw ioEx;
                }
        }

        public virtual Image Miniatura() 
        {
                try 
                {
                    if (msMiniatura == null) 
                    {
                        msMiniatura = new MemoryStream(miniatura);
                    }
                    Image tmp = Image.FromStream(msMiniatura);
                    return tmp;
                }
                catch(IOException ioEx)
                {
                    if (msMiniatura != null) msMiniatura.Close();
                    throw ioEx;
                }
        }

        public virtual Categoria Categoria
        {
            get { return this.cat; }
            set { this.cat = value; }
        }

        public virtual String Comentario
        {
            get { return this.strComentario; }
            set { this.strComentario = value; }
        }

        public virtual Salon Salon 
        {
            get { return this.salon; }
            set {this.salon = value; }
        }

        private String ExtraerNombreImagen(String pStrRuta) {
            String strAux = pStrRuta;
            
            int intLastSlash = strAux.LastIndexOf("\\");
            strAux = strAux.Substring(intLastSlash + 1 );

            int intLastDot = strAux.LastIndexOf(".");
            strAux = strAux.Substring(0, strAux.Length - (strAux.Length - intLastDot));

            return strAux;
        }

        public virtual int TamañoEnKB
        {
            get { return imagen.Length / 1024; }
        }
    }
}
